在上一个HDMI的基础上进行修改硬件:
由于 ZYNQ的PS 调用EMIO方式 默认输出是GMII,而我们的网络部分(转接卡)的芯片 RTL8211是 输出RGMII的,所以这里我们需要增加一个 GMII和RGMII转换的IP模块 (Gmii to Rgmii)
打开 GMII TO RGMII模块 设置更改成下面
又因为GMII TO RGMII 是高电平复位 ,但是ZYNQ 是输出低电平复位的,所以这里需要增加一个反相器(搜索utility, 在检索出来的选项里 选择 utility vector logic)
在设置页里改成 not(反相器)将位宽改成1
由于网口的配置要求和HDMI的配置要求有冲突,我们需要修改一下对ZYNQ的设置:
按下图进行连接:
block design 修改完成后保存,然后重新 Generate Output Products 和“Create HDL Wrapper”。接下来我们还要修改约束文件,根据原理图为 Ethernet1 接口分配引脚。
保存约束文件,然后进行之后操作重新生成 BIT 文件
由于可以与Ethernet0共用同一个工程,所以不需要建立新的工程,不过还是在其基础上有所修改:
在工程的代码文件下将网口改为Ethernet1:
修改lwip库文件:
修改lwip211.mld文件:
根据软件安装路径,我的是在C:\Xilinx\Vitis\2021.1\data\embeddedsw\ThirdParty\sw_services\lwip211_v1_5\data这个路径下:添加以下内容:
BEGIN CATEGORY emio_options PARAM name = emio_options, desc = "Settings for ETH using EMIO in PL"; PARAM name = use_gmii2rgmii_core_on_eth0, desc = "Settings for ETH0 using GMII to RGMII ip core in PL", type = bool, default = false; PARAM name = use_gmii2rgmii_core_on_eth1, desc = "Settings for ETH1 using GMII to RGMII ip core in PL", type = bool, default = false; PARAM name = gmii2rgmii_core_address_on_eth0, desc = "Settings for ETH0's PHY address of GMII to RGMII ip core in PL", type = int, default = 0; PARAM name = gmii2rgmii_core_address_on_eth1, desc = "Settings for ETH1's PHY address of GMII to RGMII ip core in PL", type = int, default = 0; END CATEGORY之后打开BSP,按照下图修改设置值:
修改lwip211.tcl文件(文件路径:C:\Xilinx\Vitis\2021.1\data\embeddedsw\ThirdParty\sw_services\lwip211_v1_5\data),添加如下内容:
x
proc generate_lwip_opts {libhandle} { .... # Content added begins # EMIO options set use_gmii2rgmii_core_on_eth0 [common::get_property CONFIG.use_gmii2rgmii_core_on_eth0 $libhandle] set use_gmii2rgmii_core_on_eth1 [common::get_property CONFIG.use_gmii2rgmii_core_on_eth1 $libhandle] set gmii2rgmii_core_address_on_eth0 [common::get_property CONFIG.gmii2rgmii_core_address_on_eth0 $libhandle] set gmii2rgmii_core_address_on_eth1 [common::get_property CONFIG.gmii2rgmii_core_address_on_eth1 $libhandle]
if { $use_gmii2rgmii_core_on_eth0 == true } { puts $lwipopts_fd "\#define XPAR_GMII2RGMIICON_0N_ETH0_ADDR $gmii2rgmii_core_address_on_eth0" } if { $use_gmii2rgmii_core_on_eth1 == true } { puts $lwipopts_fd "\#define XPAR_GMII2RGMIICON_0N_ETH1_ADDR $gmii2rgmii_core_address_on_eth1" } # Content added ends
puts $lwipopts_fd "\#endif" close $lwipopts_fd}同样,修改完之后一定记得右击平台工程进行Build Project:
编译工程成功后,用type-c USB线将开发板的JTAG和电脑连接,使用另外一根type-c USB线将开发板的PS UART和电脑连接。找一个网线和电脑连接上,在电脑上打开串口调试工具MobaXterm,和开发板的PS UART建立连接。通过串口观察到网络已经启动,并且 网络IP为192.168.3.150,网络端口为port 7。
用相同路由器网段的 WINDOWS电脑(可以用本主机的IP ) ping 一下这个IP 可以ping 通,说明网络连接成功了:
通过网络调试助手连接后,发送什么数据,就能通过网络接收到什么数据(设置的端口号是7,IP地址按照之前串口读到的板子IP地址设置),在电脑端运行个tcp client :